const Koa = require('koa'),
  app = new Koa(),
  session = require('koa-session'),
  render = require('koa-art-template'),
  bodyparser = require('koa-bodyparser'),
  // logger = require('koa-logger'),
  onerror = require('koa-onerror'),
  path = require('path'),
  moment = require('moment');

const DB = require('./module/DB');
const index = require('./routes/index');
const admin = require('./routes/admin');
const api = require('./routes/api');
const port = 80;

/**
 * koa-session相关配置项
 */
app.keys = ['some secret hurr'];
const CONFIG = {
  key: 'koa:sess', /** (string) cookie密钥（默认为koa：sess） */
  /** maxAge接受数字或'session'，数字以毫秒为单位（默认为1天86400000） */
  /** 如果值为'session'时，将导致cookie在会话/浏览器关闭时到期 */
  // maxAge: 86400000,
  maxAge: 'session',
  autoCommit: true, /** (boolean) 自动提交头文件（默认为true） */
  overwrite: true, /** (boolean) 可以覆盖或不覆盖（默认为true） */
  httpOnly: true, /** (boolean) 是否只有服务端可访问（默认为true） */
  signed: true, /** (boolean) 是否签名（默认为true） */
  rolling: false, /** (boolean) 强制在每个响应上设置会话标识符cookie。到期时间重置为原始maxAge，重置到期倒计时。（默认为false） */
  renew: false, /** (boolean) 是否续订session，可用于始终保持用户登录。（默认为false）*/
};

/**
 * 配置中间件
 */
// 捕获错误中间件
onerror(app);

// 配置koa-session中间件
app.use(session(CONFIG, app));

// 配置koa-art-template模板引擎中间件（注意：必须在路由之前配置）
render(app, {
  root: path.join(__dirname, 'views'), // 模板路径
  extname: '.art', // 模板后缀名
  debug: process.env.NODE_ENV !== 'production', // 是否开启debug模式
  dateFormat: dateFormat = value => { // 配置管道
    return moment(value).format('YYYY-MM-DD HH:mm:ss')
  }
});

// 配置koa-bodyparser中间件（解析post请求参数）
app.use(bodyparser({
  enableTypes: ['json', 'form', 'text']
}));

// 配置koa-logger中间件（输出请求日志：请求类型和路由）
// app.use(logger());

// 配置koa-static中间件（配置静态资源路径，会将配置的路径转为路径/，例如在页面中引用static中的css文件夹，直接使用/css即可）
app.use(require('koa-static')(__dirname + '/public'));

// 设置全局变量（可在任意模板中使用ctx.state中的数据）
app.use(async (ctx, next) => {
  // console.log(ctx.request);
  ctx.state = {
    '__ROOT__': `http://${ctx.request.header.host}`,
    '__PREV__': ctx.request.header.referer, // 上一页地址
    'DB': DB
  };
  await next();
});

// 配置路由
app.use(index.routes(), index.allowedMethods());
app.use(admin.routes(), admin.allowedMethods());
app.use(api.routes(), api.allowedMethods());

// 配置响应状态自定义
app.use(async (ctx, next) => {
  // console.log(`响应状态中间件开始`);
  await next();
  // console.log(`响应状态${ctx.status}`);
  if (ctx.status === 404) {
    ctx.body = '这是一个404页面';
  }
});

/**
 * 配置监听端口
 */
app.listen(port, () => {
  console.log(`Koa-CMS项目在${port}端口启动！当前环境：` + process.env.NODE_ENV)
});